#!/bin/bash

# ===========================================
# sqlcheck-frontend 部署脚本（按环境路由，和后端一致）
# 本地打包 → 压缩 → 上传 → 远程解压替换 → 健康检查
# ===========================================

set -e

# --- 使用说明 ---
show_usage() {
  cat <<USAGE
用法: $0 {dev|test|sit|odev|oprod} [nginx_port]
示例:
  $0 dev          # 部署到开发环境，默认端口 13000
  $0 prod 80       # 部署到生产环境，健康检查端口 80
USAGE
}

# --- 解析参数 ---
ENV_ARG=$1
if [ -z "$ENV_ARG" ]; then
  show_usage
  exit 1
fi
NGINX_PORT=${2:-13000}

# --- 根据环境选择服务器（与后端一致）---
case $ENV_ARG in
  dev|test|sit|prod)
    PASSWORD="Qinxiao#12345"
    REMOTE_USER="appadmin"
    REMOTE_HOST="168.61.74.34"
    REMOTE_DIR="/home/appadmin/app/sqlcheck-frontend"
    ;;
  odev|oprod)
    PASSWORD="Sunny1234"
    REMOTE_USER="appadmin"
    REMOTE_HOST="115.159.214.105"
    REMOTE_DIR="/home/appadmin/app/sqlcheck-frontend"
    ;;
  *)
    echo "不支持的环境: $ENV_ARG"
    show_usage
    exit 1
    ;;
esac

# --- 依赖检查 ---
if ! command -v npm >/dev/null 2>&1; then
  echo "未检测到 npm，请安装 Node.js 环境后重试。"
  exit 1
fi
if ! command -v zip >/dev/null 2>&1; then
  echo "未检测到 zip，请安装 zip 工具后重试。"
  exit 1
fi
if ! command -v sshpass >/dev/null 2>&1; then
  echo "未检测到 sshpass，请安装后重试（macOS 可用 brew install hudochenkov/sshpass/sshpass）"
  exit 1
fi

# --- 进入前端目录 ---
cd "$(cd "$(dirname "$0")" && pwd)" || exit 1

# === 1. 本地打包 ===
echo "[1/5] 开始前端项目打包... ($ENV_ARG)"
npm install && npm run build
if [ $? -ne 0 ]; then
  echo "前端打包失败，终止部署。"
  exit 1
fi

# === 2. 打包静态资源为 zip ===
cd build || { echo "build 目录不存在"; exit 1; }
ZIP_FILE="sqlcheck-frontend-$(date +%Y%m%d%H%M%S).zip"
zip -r "$ZIP_FILE" ./* >/dev/null
cd ..

# === 3. 上传 zip 包到服务器 ===
echo -n "[2/5] 正在上传前端zip包到 $REMOTE_HOST..."
(
  sshpass -p "$PASSWORD" scp "build/$ZIP_FILE" "$REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/" &
  SCP_PID=$!
  while kill -0 $SCP_PID 2>/dev/null; do
    echo -n "."
    sleep 1
  done
  wait $SCP_PID
)
if [ $? -ne 0 ]; then
  echo "\n上传zip包失败"
  exit 1
fi
echo " 完成"

# === 4. 远程解压并替换静态资源 ===
echo "[3/5] 远程替换静态资源..."
sshpass -p "$PASSWORD" ssh "$REMOTE_USER@$REMOTE_HOST" << EOF
set -e
mkdir -p "$REMOTE_DIR"
cd "$REMOTE_DIR"
# 备份旧站点（保留最近3个）
[ -d backup ] || mkdir -p backup
TS=\$(date +%Y%m%d%H%M%S)
mkdir -p backup/\$TS
[ -f index.html ] && cp -f index.html backup/\$TS/ || true
[ -d static ] && cp -rf static backup/\$TS/ || true
[ -d assets ] && cp -rf assets backup/\$TS/ || true

# 清理旧静态资源（常见目录/文件）
rm -rf static/ assets/ css/ js/ media/ *.map index.html* 2>/dev/null || true

# 解压新包
unzip -o "$ZIP_FILE" >/dev/null
rm -f "$ZIP_FILE"

# 仅保留最近3份备份
ls -1dt backup/*/ 2>/dev/null | tail -n +4 | xargs -r rm -rf
EOF
if [ $? -ne 0 ]; then
  echo "远程解压或替换失败"
  exit 1
fi

# === 5. 健康检查（简单探活） ===
echo "[4/5] 健康检测..."
if command -v curl >/dev/null 2>&1; then
  if curl -fsS "http://$REMOTE_HOST:$NGINX_PORT/" >/dev/null; then
    echo "[5/5] 健康检查通过: http://$REMOTE_HOST:$NGINX_PORT/"
  else
    echo "[5/5] 健康检查可能失败，请手动访问: http://$REMOTE_HOST:$NGINX_PORT/"
  fi
else
  echo "未检测到 curl，跳过健康检查。"
fi

echo "✅ 前端全量部署完成！环境: $ENV_ARG，位置: $REMOTE_HOST:$NGINX_PORT"
